/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
 var nextGreaterElement = function(nums1, nums2) {
  // 生成一个初始栈
  let stack = []
  // 初始映射
  let map = new Map()
  // 遍历nums2数组
  for(let i = 0;i < nums2.length;i++){
    // 当栈内有元素的时候 判断 当前的元素和栈顶的元素的大小 如果栈顶的元素 小于当前的元素 获得栈顶元素的下标 设置map的键为这个下标在nums2中对应的值,值为当前下标在nums2中对应的值
    while(stack.length && nums2[i] > nums2[stack[stack.length-1]]){
      let index = stack.pop()
      map.set(nums2[index],nums2[i]) // 建立映射 键是栈顶元素对应的值 值是大于这个元素的元素
    }
    stack.push(i) // 退出循环后将当前的下标放入栈中
  }
  let res = []
  for(let j = 0;j < nums1.length;j++){
    res[j] = map.get(nums1[j]) || -1 // 遍历这个nums1 如果这个元素能在映射中找到 就取出响应的值
  }
  return res // 最后返回res数组
};







/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
 var nextGreaterElement = function(nums1, nums2) {
  let stack = []
  let map = new Map()
  for(let i = 0;i < nums2.length;i++){
    while(stack.length && nums2[stack[stack.length-1]] < nums2[i]){
      let index = stack.pop()
      map.set(nums2[index],nums2[i])
    }
    stack.push(i)
  }
  let res = []
  for(let i = 0;i < nums1.length;i++){
    res[i] = map.get(nums1[i]) || -1
  }
  return res
};